package com.yunhe.realtime.service.data;

import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.exception.ObjectNotFoundException;
import com.yunhe.common.exception.UniqueConstraintsException;
import com.yunhe.common.model.data.Measurement;
import org.springframework.scheduling.annotation.Async;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 实时数据Service
 *
 * @author liuronglei
 * @desc 实时数据服务类定义
 */
public interface RealtimeService {

    /**
     * 获得量测实时值
     * @param pnList 点号列表
     */
    Map<Long, Double> findMeasureRealtime(List<Long> pnList);

    /**
     * 获得量测实时值_点号为字符串的形式
     * @param pnList 点号列表
     */
    Map<String, Double> findMeasureRealtimeByStr(List<String> pnList);

    /**
     * 获得量测实时对象
     * @param pnList 点号列表
     */
    Map<Long, Measurement> findMeasureRealtimeObj(List<Long> pnList);

    /**
     * 获得量测实时对象_字符串形式
     * @param pnList 点号列表
     */
    Map<String, Measurement> findMeasureRealtimeObjByStr(List<String> pnList);

    /**
     * 保存量测实时值
     *
     * @param pointNumber 点号
     * @param value       量测值
     */
    void saveMeasureRealtime(Long pointNumber, Double value);

    /**
     * 批量保存量测实时值
     *
     * @param pointNumberValueMap 点号和值对应Map
     */
    void saveMeasureRealtime(Map<Long, Double> pointNumberValueMap)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 批量保存量测实时值（异步方法）
     *
     * @param pointNumberValueMap 点号和值对应Map
     */
    void saveMeasureRealtimeAsync(Map<Long, Double> pointNumberValueMap)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 保存量测实时对象
     *
     * @param measurement 量测对象
     */
    void saveMeasureRealtimeObj(Measurement measurement);

    /**
     * 批量保存量测实时对象
     *
     * @param list 量测对象列表
     */
    void saveMeasureRealtimeObj(List<Measurement> list)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 批量保存量测实时对象（异步方法）
     *
     * @param list 量测对象列表
     */
    void saveMeasureRealtimeObjAsync(List<Measurement> list);

    /**
     * 删除量测实时对象（异步方法）
     * @param pointNumbers 点号列表
     */
    void delAsync(List<Long> pointNumbers);

    /**
     * 删除量测实时对象的备份（异步方法）
     * @param pointNumbers 点号列表
     */
    void delBackupAsync(List<Long> pointNumbers);

    /**
     * 将量测实时对象转为备份（异步方法）
     * @param pointNumbers 点号列表
     */
    void movetoBackupAsync(List<Long> pointNumbers);

    /**
     * 获得量测实时对象备份
     * @param pointNumbers 点号列表
     */
    Map<Long, Double> getBackup(List<Long> pointNumbers);

    /**
     * 更新量测实时对象
     * @param pointNumber 点号
     * @param rtime 时间戳
     * @param dtime 时间字符串
     * @param val 值
     * @param flag 标记
     */
    void updateMeasureRealtime(Long pointNumber, Long rtime, String dtime, Double val, Integer flag);

    /**
     * 添加值
     *
     * @param key      键
     * @param value    值
     * @param liveTime 过期时间（秒）
     */
    void setString(String key, String value, Optional<Integer> liveTime);

    /**
     * 获得值
     *
     * @param key 键
     */
    String getString(String key);

    /**
     * 添加对象
     *
     * @param key      键
     * @param value    值
     * @param liveTime 过期时间（秒）
     */
    void setMap(String key, Map value, Optional<Integer> liveTime);

    /**
     * 获得对象
     *
     * @param key 键
     */
    Map getMap(String key);

    /**
     * 删除值
     *
     * @param key 键
     */
    void delString(String key);

    /**
     * 是否存在键
     *
     * @param key 键
     */
    boolean hasKey(String key);
}
